<?php
/**
 * Viewモジュール
 * YuToriPHPFramework標準ビューモジュール
 * 
 * @since 2012/01/17
 */
class View {
	// MimeTypeの一覧
	private $MimeTypeList = null;

	public function __construct () {
		// Moduleに設置する
		Y('Module')->add($this, __CLASS__);

		$objMod = Y('View');
		$objMod->add(Y::func($this, 'getType'));

		$objMod->add(Y::func($this, 'head'));
		$objMod->add(Y::func($this, 'body'));
		$objMod->add('', 'Common');
		$objMod->add(DIR_APP.'/views', 'Dir');
	}
	
	/**
	 * callすると配下のHeadとBodyをcallする。
	 * 
	 * @since 2012/01/17
	 */
	public function call () {
		Y('Log.d')->call('出力開始');
		$objMod = Y('View');
		$objMod->child('Head')->call();
		$objMod->child('Body')->call();
		return $this;
	}
	
	/**
	 * 指定したファイルをincludeする。
	 * 基本的に出力目的。
	 * 
	 * ファイルを指定していない場合、子オブジェクト(ブロック)に対してcallをかける。
	 * 文字列の戻り値があった場合、戻り値がファイル名であればincludeし、それ以外はそのまま出力する。
	 * 
	 * @since 2012/01/17
	 */
	public function body ($string = '') {
		Y('Log.d')->call('本文出力');
		return true;
	}

	/**
	 * 指定した文字列をheader()で出力する。
	 * 
	 * ファイルを指定していない場合、子オブジェクト(ブロック)に対してcallをかける。
	 * 文字列の戻り値があった場合、そのまま出力する。
	 * 
	 * @since 2012/01/17
	 */
	public function head ($string = '') {
		Y('Log.d')->call('HTTPヘッダ出力');
		if ($string === '') {
			$objHeaders = Y::sel();
			$cntHeaders = $objHeaders->count();
			for ($header = 0; $header < $cntHeaders; $header++) {
				$rtnHeader = $objHeaders->child($header)->call();
				if (is_string ($rtnHeader)) {
					header ($rtnHeader);
				}
			}
		} else {
			header ($string);
		}
		return true;
	}

	/**
	 * mime-typeの判別
	 * 判別したmime-typeは自動的にView.Head.Content-Typeに格納される。
	 * 
	 * @since 2012/01/18
	 */
	public function getType ($Request = '') {
		if (empty($this->MimeTypeList)) {
			if (file_exists (dirname(__FILE__). '/View/mimetypelist.ini')) {
				$this->MimeTypeList = parse_ini_file (dirname(__FILE__). '/View/mimetypelist.ini', false);
			} else {
				$this->MimeTypeList = null;
			}
		}
		
		$Request = strtolower ($Request);

		if ($Ext = strrchr ($Request, '.')) {
			if (isset($this->MimeTypeList[$Ext])) {
				$Mime =$this->MimeTypeList[$Ext];
			} else {
				$Mime =$this->MimeTypeList['default'];
			}
		} else {
			$Mime =$this->MimeTypeList['default'];
		}
/*
		if ($Mime == 'text/html' && eregi('application/xhtml\+xml',$_SERVER['HTTP_ACCEPT'])) {
			$Mime = 'application/xhtml+xml';
		}
*/
		$Return = 'Content-Type: '.$Mime . '; charset="UTF-8"';
		
		Y('View.Head')->add ($Return, 'Content-Type');

		return $Return;
	}

}

new View();